#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv2\imgproc.hpp>
#include <opencv2\highgui.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);

/// Function header
void thresh_callback(int, void* );
void testFindCounter();
/** @function main */
int main( int argc, char** argv )
{
    testFindCounter();
    waitKey(0);
    return(0);
}
void testFindCounter()
{
    /// Load source image and convert it to gray
    src=cv::cvarrToMat(cvLoadImage("D:\\SWT_OUT\\SWTCV\\das.jpg"));
    if(!(src).data)
        return;

    /// Convert image to gray and blur it
    cvtColor( src, src_gray, CV_BGR2GRAY );
    blur( src_gray, src_gray, Size(3,3) );

    /// Create Window
    char* source_window = "Source";
    namedWindow( source_window, CV_WINDOW_AUTOSIZE );
    imshow( source_window, src );

    createTrackbar( " Canny thresh:", "Source", &thresh, max_thresh, thresh_callback );
    thresh_callback( 0, 0 );
}

/** @function thresh_callback */
void thresh_callback(int, void* )
{
    Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;



    /// Detect edges using canny
    Canny( src_gray, canny_output, thresh, thresh*2, 3 );
    /// Draw contours
    Mat drawing = Mat::zeros( canny_output.rows,canny_output.cols, CV_8UC3 );
    /// Find contours
    findContours( canny_output, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
    int idx = 0;
    for( ; idx >= 0; idx = hierarchy[idx][0] )
    {
        Scalar color( 255,255, 255 );
        drawContours( drawing, contours, idx, color, FILLED, 8, hierarchy );
    }

    /// Show in a window
    namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
    imshow( "Contours", drawing );
}
